/*
    Seminar Computergrafik SS2012
    Praktikum
    Fachhochschule Münster
    Fachbereich Elektrotechnik und Informatik    
    
    Autoren: Alexander Kuhn & Mark Ruffer
*/

/**
 * Push Funktion für die model view Matrix
 */ 
function mvPushMatrix(){
    var copy = mat4.create();
    mat4.set(mvMatrix, copy);
    mvMatrixStack.push(copy);
}

/**
 * Pop Funktion für die model view Matrix
 */ 
function mvPopMatrix(){
    if(mvMatrixStack.length == 0){
        throw("Pop Aufruf an leerem Stack. Aufrufe prüfen!");
    }
    else {
        mvMatrix = mvMatrixStack.pop();
    }
}

/**
 * Berechnet die Radiant für gegebene Winkel in Grad
 * @param deg Winkel in Grad
 * @return Winkel in Radiant
 */   
function degToRad(deg){
    return deg * Math.PI / 180.0;
}

/**
 * Baue einen Array mit jeder Farbe 4x nacheinander
 * @param Array mit den einzelnen Farben
 * @return Array mit allen Farben
 */   
function unpackColors(packedColors){
    var i, j, unpackedColors, color;
    unpackedColors = [];
    for (i in packedColors) {
      color = packedColors[i];
      for (j=0; j < 2; j++) {
        unpackedColors = unpackedColors.concat(color);
        unpackedColors = unpackedColors.concat([1.0, 1.0, 1.0, 1.0]);
        unpackedColors = unpackedColors.concat([1.0, 1.0, 1.0, 1.0]);
      }
    }
    return unpackedColors;
}

/**
 * Berechnet den Vertex Array für einen Würfel
 * @param x X Position untere linke Ecke
 * @param y Y Positiion untere linke Ecke
 * @param z Z Position untere linke Ecke
 * @param width Breite des Würfels
 * @param height Höhe des Würfels
 * @param depth Tiefe des Würfels
 * @return Vertex Array (front, hinten, oben, unten, rechts, links)
 */        
function cubeArray(x, y, z, width, height, depth){
    var array = [];
    array = [
        x, y, z, x+width, y, z, x+width, y+height, z, x, y+height, z,
        x, y, z-depth, x+width, y, z-depth, x+width, y+height, z-depth, x, y+height, z-depth,
        x, y+height, z, x+width, y+height, z, x+width, y+height, z-depth, x, y+height, z-depth,
        x, y, z, x+width, y, z, x+width, y, z-depth, x, y, z-depth,
        x+width, y, z, x+width, y, z-depth, x+width, y+height, z-depth, x+width, y+height, z,
        x, y, z, x, y, z-depth, x, y+height, z-depth, x, y+height, z
    ];
    return array;
}

/**
 * Bringe die JavaScript Matrizen auf den Grafikkartenspeicher
 */
function setMatrixUniforms() {
    gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
    gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);
}